#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 10010;

int p[N], w[N];
int n, m;

int find(int x)
{
    if(p[x] == x || p[p[x]] == p[x]) return p[x];
    int r = find(p[x]);
    // w[r] 表示父节点到根节点之间的数据量
    w[x] += w[p[x]];
    p[x] = r;
    return r;
}

// 用当前位置到根节点的路径之间的前缀和来表示收到的信号
// 当两个树之间合并的时候，为了保证答案不出现错误，被当作子树的根的值需要减去作为主根的值
// 第二种方法：将两个将要合并的结点用一个新的结点拼接在一起


int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; ++i)
        p[i] = i;
        
    int op, a, b;
    while(m--)
    {
        cin >> op >> a >> b;
        if(op == 1)
        {
            a = find(a), b = find(b);
            if(a != b)
            {
                w[a] -= w[b];
                p[a] = b;
            }
        }
        else
        {
            a = find(a);
            w[a] += b;
        }
    }
    for(int i = 1; i <= n; ++i)
    {
        if(find(i) == i) cout << w[i] << ' ';
        else cout << (w[i] + w[find(i)]) << ' ';
    }
    cout << endl;
    return 0;
}